Raspberry Pi Pico2でCPU実験のレイトレを動かしたい
#Adafruit_Metro_RP2350 #RP2350 #RaspberryPiPico #Raspberry_Pi_Pico2 #低レイヤ #MinCaml
from Adafruit Metro RP2350
https://gyazo.com/3e12c296e6a581ce0d7cf1406999253b
浮動小数点ユニット(FPU)を搭載していなかったためにレイトレの移植を諦めた Raspberry Pi Pico だったが、Raspberry Pi Pico 2になって FPU が搭載されて、浮動小数点演算命令を使えるようになった。また、Raspberry Pi Pico 2 が搭載している RP2350 チップは PSRAM にも対応しており、Adafruit Metro RP2350 などには 8MB の PSRAM が搭載されている。
FPUがあって主記憶メモリも8MBあれば、CPU実験のレイトレも動くのでは?ということで、Raspberry Pi Pico 2のMCUチップ「RP2350」へ MinCaml を移植し、レイトレを動かしてみることにした。
ターゲットボード
Adafruit Metro RP2350 → Raspberry Pi Pico2
PSRAM が 8MB ある Adafruit Metro RP2350 で動かす予定だったが、RAM 512KB の Raspberry Pi Pico2 でも動いてしまった
CPUアーキテクチャと命令セット
RP2350 は、ARMとRISC-Vのデュアルコア
ARMコア→Cortex-M33
RISC-Vコア→名前忘れた
RISC-VコアはFPUを搭載していないので、今回はARMコアを利用
Thumb-2 命令セット
Cortex-M33の命令セット
シミュレータ
ラズピコ実機への転送は少し面倒なので、MinCaml移植の大半はQEMU(エミュレータ?シミュレータ ?)上で行った。
作業記録
2026/05/01
MinCamlコンパイラ用のリポジトリを作成
https://github.com/thata/min-caml-rp2350
RP2350用の各種ファイルを用意
2026/5/3
stub.cをCortex-M33 on QEMUで動かす
2026/5/4
4649を出力するだけのRP2350コードを出力
2026/5/5
関数定義と関数呼び出しを行うRP2350コードを出力
条件分岐するRP2350コードを出力
2026/5/6
浮動小数点数を扱うRP2350コードを出力
uart_puts を消すと動かない問題
浮動小数点数の比較を行うRP2350コードを出力
2026/5/10
浮動小数点まわりのエラーに対応
MinCamlの配列を生成するRP2350コードを出力
マンデルブロを動かすRP2350コードを出力
test/* をRP2350で動かす
2026/5/11
UARTのループバックをRP2350で動かす
2026/5/14
レイトレをRP2350で動かす
MinCaml で書いたプログラムを Metro のファームウェアとして書き込む
Raspberry Pi Pico2でもほとんどそのまま使える
2026/5/16
レイトレを Raspberry Pi Pico2 の実機上で動かす
RAMが128KB程度でもレイトレ動いて驚いた
メモ
QEMU上での動作環境作成が大変だった。LLMが無かったら、さらに数週間かかってたかも
Thumb-2 命令セットのまとまった情報無さすぎ
RP2040の浮動小数点演算がソフトウェア処理なことを知らなかったら、softfpとhardfpに違いに気づかなかったかも。危なかった